package cn.zqy.demo2.day06.WaitAndNotify;

/**
 *     进入到TimeWaiting(计时等待)有两种方式
 *     1.使用sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态
 *     2.使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/Blocked状态
 *
 *     唤醒的方法:
 *          void notify() 【随机唤醒】在此对象监视器上等待的单个线程。
 *          void notifyAll() 唤醒在此对象监视器上等待的【所有线程】。
 * */
public class Demo02WaitAndNotifyAll {
    public static void main(String[] args) {
        //创建锁对象,保证唯一
        String obj = "wait";

        new Thread() {
            @Override
            public void run() {
                synchronized (obj) {
                    System.out.println("顾客1：包子我要！！！");
                    try {
                        obj.wait(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("顾客1吃包子");
                }
            }
        }.start();

        new Thread() {
            @Override
            public void run() {
                synchronized (obj) {
                    System.out.println("顾客2：包子我要！！！");
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("顾客2吃包子");
                }
            }
        }.start();

        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
                synchronized (obj) {
                    System.out.println("包子来了！！！");
                    //obj.notify();//如果有多个等待线程,随机唤醒一个
                    obj.notifyAll();//唤醒所有等待的线程
                }
            }
        }.start();
    }
}
